#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "esp_log.h"

#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "freertos/task.h"

#include "drv_eth.h"
#include "RCS_socket.h"

/**
 * 以太网驱动应该负责网络的连接，重连，把wifi和bc260统一成一个接口，给app层使用。
 *
 * 但是目前接收部分无法统一，bc260 和 socket的状态机不一样，只能在发送部分统一，使用
 *  etx线程接收app层传入的数据，通过队列，让app层不阻塞。
 *
 * 接口：
 *
 */
// typedef struct net_dev_s {
//   uint8_t is_net_up;
// } net_dev_t;

// static net_dev_t net_dev = {0};

// int eth_dev_init(void) {
//   return 0;
// }

// uint8_t eth_is_net_up(void) {
//   return net_dev.is_net_up;
// }

#define DRV_ETH_SEND_Q_LEN 10

typedef struct eth_queue_s
{
  uint8_t *data_p;
  uint16_t data_length;
} eth_queue_t;

// 装在数据包的指针， 目前不增加ack，直接在etx线程里发送完毕后释放。
static QueueHandle_t drv_eth_tx_queue;

static const char *TAG = "DRV_ETH";

void drv_eth_tx(uint8_t *data, uint16_t data_len)
{
  eth_queue_t q = {
      .data_p = data,
      .data_length = data_len,
  };
  xQueueSend(drv_eth_tx_queue, &q, portMAX_DELAY);
}

void etx_thread(void *arg)
{
  BaseType_t xStatus;
  eth_queue_t q = {0};
  while (1)
  {
    xStatus = xQueueReceive(drv_eth_tx_queue, &q, portMAX_DELAY);
    ESP_LOGI(TAG, "data: %p, len: %d", q.data_p, q.data_length);
    if (q.data_p)
    {
      rcs_socket_send((uint8_t *)q.data_p, q.data_length);
      free(q.data_p);
    }
  }
}

void drv_eth_init(void)
{
  drv_eth_tx_queue = xQueueCreate(DRV_ETH_SEND_Q_LEN, sizeof(eth_queue_t));
  xTaskCreate(etx_thread, "etx_thread", 1024 * 6, NULL, 13, NULL);
}
